package com.doit.spark.day04

import com.doit.spark.day01.utils.SparkUtil
import org.apache.spark.rdd.RDD
import org.apache.spark.storage.StorageLevel

/**
 * @DATE 2022/1/6/22:20
 * @Author MDK
 * @Version 2021.2.2
 * */
object C03_缓存 {
  def main(args: Array[String]): Unit = {
    val sc = SparkUtil.getSc
    val rdd = sc.textFile("data/word1.txt")
    val rdd2 = rdd.flatMap(_.split("\\s+"))
    val rdd3: RDD[String] = rdd2.map(e => {
      println("exe...")
      e
    })

    //将rdd2放置在缓存中  rdd3.cache()
    //缓存命令需要行动算子触发  cache()方法底层调用的是 persist()方法
    //rdd3.persist()  //StorageLevel.MEMORY_ONLY  仅在内存中进行存储
    //数据默认存储在缓存中
    rdd3.cache()
    val rdd4: RDD[String] = rdd3.map(_.toUpperCase)
    val rdd5: RDD[(String, Int)] = rdd3.map((_, 1))
    val rdd6: RDD[(String, String)] = rdd3.map(e => (e, e.toUpperCase))

    /*
    *   collect()方法触发程序执行  每个元素执行一次
    *   如果不缓存,每个collect()方法 就会让rdd3执行一次EXE,执行9次  缓存之后就会执行3次
    *
    * */
    rdd4.collect()
    rdd5.collect()

    //清除缓存
    rdd3.unpersist()
    rdd6.collect()

  }
}
